package com.example.demo;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Component
@Slf4j
public class AfterBeanInit implements InitializingBean {

    /**
     * 1、Spring为bean提供了两种初始化bean的方式，实现InitializingBean接口，实现afterPropertiesSet方法，或者在配置文件中通过init-method指定，两种方式可以同时使用。
     * 2、实现InitializingBean接口是直接调用afterPropertiesSet方法，比通过反射调用init-method指定的方法效率要高一点，但是init-method方式消除了对spring的依赖。
     * 3、如果调用afterPropertiesSet方法时出错，则不调用init-method指定的方法。
     * 4、init 先于 afterPropertiesSet 被调用
     * */
    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("afterPropertiesSet方法执行");
    }

    @PostConstruct
    public void init(){
        log.info("init方法执行");
    }

    @PreDestroy
    public void close(){
        log.info("close方法执行");
    }
}
